package LimitedTimeGame.Day_0220;

/**
 * @author zxc
 * @date 2023/02/20 22:59
 **/

/**
 * 题目 ：最好的扑克手牌
 * 题目详述 ：
 * 给你一个整数数组ranks和一个字符数组suit。你有5张扑克牌，第i张牌大小为ranks[i]，花色为suits[i]。
 * 下述是从好到坏你可能持有的 手牌类型：
 * "Flush"：同花，五张相同花色的扑克牌。
 * "Three of a Kind"：三条，有 3 张大小相同的扑克牌。
 * "Pair"：对子，两张大小一样的扑克牌。
 * "High Card"：高牌，五张大小互不相同的扑克牌。
 * 请你返回一个字符串，表示给定的 5 张牌中，你能组成的 最好手牌类型。
 * 注意：返回的字符串大小写需与题目描述相同。
 *
 * 提示：
 * ranks.length == suits.length == 5
 * 1 <= ranks[i] <= 13
 * 'a' <= suits[i] <= 'd'
 * 任意两张扑克牌不会同时有相同的大小和花色。
 *
 */
public class BestHand {
    /**
     * 思路 ：
     * 使用辅助数组，来记录不同花色手牌的数量 && 不同大小手牌的数量
     * （1）辅助数组的0 ~ 3位，用来记录不同花色手牌的数量;
     * （2）辅助数组的4 ~ 16位，用来记录不同大小手牌的数量
     * @param ranks
     * @param suits
     * @return
     */
    public String bestHand(int[] ranks, char[] suits) {
        // 辅助数组dp，用来存储 手牌花色 + 手牌大小的数量;
        int[] dp = new int[17];
        int len = ranks.length;
        // 遍历str，被初始化为"";
        String str = "";
        // 遍历ranks && suits数组，来获取 手牌花色 + 手牌大小的数量
        for(int i = 0 ; i < len ; i++){
            dp[ranks[i] + 3]++;
            dp[suits[i] - 'a']++;
        }
        // 遍历辅助数组;
        for(int i = 0 ; i < 17 ; i++){
            // 即，判断花色是否一致
            if(i < 4){
                if(dp[i] == 5){
                    return "Flush";
                }
            }
            else {
                // 即，在i >= 4情况下，最好的手牌 : 即为"Three of a Kind";
                if(dp[i] >= 3){
                    return "Three of a Kind";
                }
                if(dp[i] == 2){
                    str = "Pair";
                }
            }
        }
        return "".equals(str) ? "High Card" : str;
    }
}
